const { Controller } = require('egg');
const path = require('path')
const Pump = require('mz-modules/pump');
const fs = require('fs');
class BaseController extends Controller {
  rest(rest) {
    this.ctx.body = typeof rest === 'object' ? rest : JSON.stringify(rest)
    this.ctx.type = 'application/json';
  }

  throw (msg) {
    msg = msg || 'unknown';
    this.ctx.throw(400, msg);
  }

  async singleUpload() {
    // 获取表单提交的数据
    let stream = await this.ctx.getFileStream();
    // 防止上传空文件
    if (!stream.filename) {
      return;
    }
    // 文件名，实际项目中文件名要添加时间戳
    let filename = stream.filename.toLowerCase();

    // 上传的目录，注意upload目录要存在，实际项目中以云服务器地址为准，入库要替换地址符号
    let target = 'app/public/' + path.basename(filename)
    // 创建写入流
    let writeStream = fs.createWriteStream(target);

    // 上传超过时长会卡死
    // stream.pipe(writeStream);

    // 上传超过时长不会卡死
    await Pump(stream, writeStream);
    // 返回上传的信息
    return [target,stream.fields]
    this.ctx.body = {
      // 表单上传的图片
      url: target,
      // 表单的其它数据
      fields: stream.fields
    }
  }
  async multiUpload() {
    // autoFields: true 表示除了文件的其它字段
    let parts = this.ctx.multipart({ autoFields: true });
    let files = [];
    let stream;
    // 循环获取数据流
    while ((stream = await parts()) != null) {
        if (!stream.filename) {
            // 多文件上传时，只能break,不能return
            break;
        }
        // 文件名，实际项目中文件名要添加时间戳
        let filename = stream.filename.toLowerCase();
        // 文件表单的name
        let fieldname = stream.fieldname;
        //console.log(stream);
        // 上传的目录，注意upload目录要存在，实际项目中以云服务器地址为准，入库要替换地址符号
        const index = filename.lastIndexOf('.')
        const suffix = filename.slice(index);
        const resUrl = Math.random().toString(16).slice(2) + suffix;
        let target = 'app/public/' + resUrl;

        let writeStream = fs.createWriteStream(target);
        await Pump(stream, writeStream);

        files.push(
          '/public/'+resUrl
        );
    }
    return [files,parts.field]
    // 返回上传的信息
    this.ctx.body = {
        // 表单上传的文件
        files: files,
        // 表单的其它数据，注意放到循环后面，否则拿不到对应的字段
        fields: parts.field
    }

}
  getuser() {
    return this.ctx.session.user;
  }


  success({
    message: message = '操作成功',
    data,
    token
  }) {

    // if(data)
    // if(message)
    if (token) this.ctx.set('token', token)
    this.ctx.body = {
      code: 1,
      msg: message,
      data: data ? data : {}
    };
  }


  error(message = "操作失败") {
    this.ctx.body = {
      code: -1,
      msg: message
    }
  }
}

module.exports = BaseController;